#include <stdio.h>
#include <stdlib.h>
// step 1# 定义栈结构体 ，用动态数组来存放栈中的数据
typedef struct {
   int *data;
   int size;
   int maxSize; 
} Stack;
// step 2# 初始化栈 ：分配栈结构体变量的空间、动态数组的空间
// 初始化当前栈中元素个数 0 和栈的最大容量
Stack *createStack(int maxSize) {
    Stack *stack = (Stack *)malloc(sizeof(Stack));
    stack->data = (int *)malloc(sizeof(int) * maxSize);
    stack->size = 0;
    stack->maxSize = maxSize;
    return stack;
}
// step 3# 元素入栈 ：判断栈容量是否满 ，若满则扩容
// 若不满，则把元素加入到动态数组中，并且更新栈中元素个数
void push(Stack *stack, int element) {
    if (stack->size == stack->maxSize) {
        stack->maxSize *= 2;
        stack->data[(stack->size)++] = element;
    }
    stack->data[(stack->size)++] = element;
    return;
}
// step 4# 元素出栈 ：从动态数组尾部取出一个元素并且更新栈中元素个数
int pop(Stack *stack) {
    if (stack->size == 0) return -1;
    stack->size--;
    return stack->data[stack->size];
}
// step 5# 销毁栈 ：先释放动态数组，再把栈释放
void destoryStack(Stack *stack) {
    free(stack->data);
    stack->size = 0;
    stack->maxSize = 0;
    free(stack);
    return;
}

int main() {
    Stack *stack = createStack(20);
    push(stack, 10);
    push(stack, 20);
    push(stack, 30);
    // pop(stack);

    return 0;
}
